package com.zyl.tvolatile.single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author zhaoyl
 * @date 2024/5/20 17:56
 * @description 说明 :注册式单例模式
 * 枚举:
 * 定义枚举时使用 enum 和 class 一样， 是 Java 中的一个关键字。 就像 class 对应一个 Class 类一样，
 * enum 也对应有一个 Enum 类
 * 枚举实现的单例是天生线程安全的。
 */
public enum  EnumSingle {
    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }

}
//枚举不能破坏单例
class  Test{
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        EnumSingle instance1 = EnumSingle.INSTANCE;
        // Cannot reflectively create enum objects
        //	at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
        Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class);//底层源码构造参数
        declaredConstructor.setAccessible(true);
        EnumSingle instance2 = declaredConstructor.newInstance();
        System.out.println(instance1);
        System.out.println(instance2);
    }
}